﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Ferreteria.Forms
{
    public partial class frmAgregarPedido : Form
    {
        DisancoEntities context;
        int clienteId = 0;
        DataTable dtArticulos;
        public static Pagos PagoEf;
        int pedId;

        bool editMode = false;

        //int NroComp2 = 0;
        //int NroComp1 = 1;// VERRRR
        //Articulos articulovendido;

        public frmAgregarPedido()
        {
            InitializeComponent();
            
            context = new DisancoEntities();
            dtArticulos = new DataTable();
            dtArticulos.Columns.Add("id");
            dtArticulos.Columns.Add("Articulo");
            dtArticulos.Columns.Add("Cantidad");
            dtArticulos.Columns.Add("Precio Unitario");
            dtArticulos.Columns.Add("Precio Total");

            dgvListaArt.DataSource = dtArticulos;
            dgvListaArt.Columns["id"].Visible = false;

            dgvListaArt.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            dgvListaArt.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
        }

        public frmAgregarPedido(int pedido_Id)
        {
            InitializeComponent();

            this.pedId = pedido_Id;
            editMode = true;

            context = new DisancoEntities();
            dtArticulos = new DataTable();
            dtArticulos.Columns.Add("id");
            dtArticulos.Columns.Add("Articulo");
            dtArticulos.Columns.Add("Cantidad");
            dtArticulos.Columns.Add("Precio Unitario");
            dtArticulos.Columns.Add("Precio Total");
            
            var ped = context.Pedido.FirstOrDefault(p => p.ped_id == pedido_Id);

            if (ped != null)
            {
                this.clienteId = ped.cliente_id;
                txtbCliNombre.Text = ped.Clientes.cliente_nombre;
                txtbCliDireccion.Text = ped.Clientes.cliente_direccion;
                txtbCliLocalidad.Text = ped.Clientes.cliente_localidad;
                txtbCliCuit.Text = ped.Clientes.cliente_cuit;
                txtbCliCondiva.Text = ped.Clientes.CondicionIVA.condicion_sigla;

                foreach (var lineaPed in ped.LineaPedido)
                {
                    DataRow fila = dtArticulos.NewRow();

                    fila["id"] = lineaPed.art_id;
                    fila["Articulo"] = lineaPed.Articulos.art_nombre;
                    fila["Cantidad"] = lineaPed.ped_cant;
                    fila["Precio Unitario"] = "$ " + Decimal.Round(lineaPed.ped_precio, 2);
                    fila["Precio Total"] = "$ " + Decimal.Round((lineaPed.ped_precio * lineaPed.ped_cant),2);

                    dtArticulos.Rows.Add(fila);
                }

                dgvListaArt.DataSource = dtArticulos;
                dgvListaArt.Columns["id"].Visible = false;
                dgvListaArt.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
                dgvListaArt.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;

                calcularTotales();
            }
        }

        private void btnBuscarCliente_Click(object sender, EventArgs e)
        {
            FrmBuscarCliente BuscarCli = new FrmBuscarCliente();
            BuscarCli.ShowDialog();

            if (BuscarCli.clienteSeleccionado != null)
            {
                txtbCliNombre.Text = BuscarCli.clienteSeleccionado.cliente_nombre;
                txtbCliDireccion.Text = BuscarCli.clienteSeleccionado.cliente_direccion;
                txtbCliLocalidad.Text = BuscarCli.clienteSeleccionado.cliente_localidad;

                if (BuscarCli.clienteSeleccionado.condicion_id != null)
                    txtbCliCondiva.Text = BuscarCli.clienteSeleccionado.CondicionIVA.condicion_sigla;

                txtbCliCuit.Text = BuscarCli.clienteSeleccionado.cliente_cuit;
                clienteId = BuscarCli.clienteSeleccionado.cliente_id;

                txtbCliDireccion.ReadOnly = true;
                txtbCliLocalidad.ReadOnly = true;
                txtbCliNombre.ReadOnly = true;
                txtbCliCondiva.ReadOnly = true;
                txtbCliCuit.ReadOnly = true;
            }
            BuscarCli.Dispose();
        }

        void calcularTotales()
        {
            decimal subtotal = 0;
            //double descuento = 0.10;

            foreach (DataRow filaArt in dtArticulos.Rows)
            {
                subtotal = subtotal + Convert.ToDecimal(filaArt["Precio total"].ToString().Replace("$ ",""));
            }

            Decimal iva = subtotal / 100 * Clases.VariablesDeEntorno.IVA;
            Decimal total = subtotal + iva;

            iva = Decimal.Round(iva, 2);
            total = Decimal.Round(total, 2);
            subtotal = Decimal.Round(subtotal, 2);

            txtSubTotal.Text = subtotal.ToString();
            txtSubTotal.ReadOnly = true;
            txtbIva.Text = Clases.VariablesDeEntorno.IVA.ToString();
            txtbIva.ReadOnly = true;
            txtbTotal.Text = total.ToString();
            txtbTotal.ReadOnly = true;
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            if (!editMode)
            {
                if (clienteId != 0)
                {
                    try
                    {
                        context = new DisancoEntities();

                        Pedido nuevoPed = new Pedido();

                        nuevoPed.cliente_id = this.clienteId;

                        nuevoPed.ped_fecha = DateTime.Now;

                        nuevoPed.ped_estado = "PENDIENTE";

                        foreach (DataRow fila in dtArticulos.Rows)
                        {
                            LineaPedido nuevaLinea = new LineaPedido();
                            nuevaLinea.art_id = Convert.ToInt32(fila["id"]);
                            nuevaLinea.ped_cant = Convert.ToInt32(fila["Cantidad"]);
                            nuevaLinea.ped_precio = Convert.ToDecimal(fila["Precio Unitario"].ToString().Replace("$ ", ""));

                            nuevoPed.LineaPedido.Add(nuevaLinea);
                        }

                        context.Pedido.AddObject(nuevoPed);
                        context.SaveChanges();
                        context = null;
                        this.Close();
                    }
                    catch (Exception err)
                    {
                        MessageBox.Show(err.ToString());
                    }
                }
            }
            else
            {
                try
                {
                    context = new DisancoEntities();
                    var ped = context.Pedido.FirstOrDefault(p => p.ped_id == this.pedId);

                    ped.cliente_id = this.clienteId;

                    //Se eliminan los articulos que ya no figuran en la lista y se actualizan los que aun figuran
                    int idx = 0;
                    while (idx <= ped.LineaPedido.Count - 1)
                    {
                        var linea = ped.LineaPedido.ElementAt(idx);
                        bool existe = false;

                        foreach (DataRow fila in dtArticulos.Rows)
                        {
                            if (Convert.ToInt32(fila["id"]) == linea.art_id)
                            {
                                existe = true;

                                //Se edita la fila con los datos correspondientes
                                linea.ped_cant = Convert.ToInt32(fila["Cantidad"]);
                                linea.ped_precio = Convert.ToDecimal(fila["Precio Unitario"].ToString().Replace("$ ", ""));

                                //incremento el indice para saltar al siguiente articulo
                                idx += 1;

                                break;
                            }
                        }

                        if (!existe)
                        {
                            ped.LineaPedido.Remove(linea);
                        }                        
                    }

                    context.SaveChanges();

                    //Se agregan los articulos nuevos
                    foreach (DataRow fila in dtArticulos.Rows)
                    {
                        bool existe = false;
                        foreach (var linea in ped.LineaPedido)
                        {
                            if (Convert.ToInt32(fila["id"]) == linea.art_id)
                            {
                                existe = true;
                                break;
                            }
                        }

                        if (!existe)
                        {
                            LineaPedido nuevaLinea = new LineaPedido();
                            nuevaLinea.art_id = Convert.ToInt32(fila["id"]);
                            nuevaLinea.ped_cant = Convert.ToInt32(fila["Cantidad"]);
                            nuevaLinea.ped_precio = Convert.ToDecimal(fila["Precio Unitario"].ToString().Replace("$ ", ""));

                            ped.LineaPedido.Add(nuevaLinea);
                        }
                    }           

                    context.SaveChanges();
                    this.Close();
                }
                catch (Exception err)
                {
                    MessageBox.Show(err.ToString());
                }
            }


            //if (cmbFormaDePago.SelectedItem != null)  //Controlar que la venta tga una forma de Pago Seleccionada
            //{
            //    if (this.clienteId != 0) //Controlar que la venta tga un Cliente
            //    {
            //        if (dtArticulos.Rows != null)
            //        {
            //            Ventas nuevaVenta = new Ventas();
            //            DateTime fechaventa = dtpVentaFecha.Value.Date;

            //            CalcularNroComprobante(TipoComp, fechaventa, Aut);

            //            nuevaVenta.cliente_id = this.clienteId;
            //            nuevaVenta.venta_tipo_comprobante = TipoComp;
            //            nuevaVenta.venta_fecha = Convert.ToDateTime(dtpVentaFecha.Value);

            //            //nuevaVenta.venta_numero_comprobante_2 = NroComp2;// falta incrementar y controlar el nro comp1

            //            //nuevaVenta.venta_numero_comprobante_1 = NroComp1; // falta controlaarrrr


            //            int i = 0;
            //            int k = dtArticulos.Rows.Count;

            //            LineaVenta[] arraylineavta = new LineaVenta[k];

            //            foreach (DataRow fila in dtArticulos.Rows) // Agrega los articulos a la linea de venta
            //            {
            //                LineaVenta linea = new LineaVenta();
            //                linea.art_id = Convert.ToInt32(fila["id"]);
            //                linea.cantidad_venta = Convert.ToInt32(fila["Cantidad"]);
            //                linea.precio_venta = Convert.ToDecimal(fila["Precio total"]);
            //                arraylineavta[i] = linea;
            //                i = i + 1;
            //            }

            //            try
            //            {
            //                if (cmbFormaDePago.SelectedItem == "CONTADO EFECTIVO")
            //                {

            //                    FrmPagoEfectivo PagoEfectivo = new FrmPagoEfectivo(Convert.ToDecimal(txtbTotal.Text), this.clienteId, Convert.ToDateTime(dtpVentaFecha.Value), PagoEf);
            //                    PagoEfectivo.ShowDialog();
            //                    PagoEfectivo.Dispose();
            //                    nuevaVenta.pago_id = PagoEf.pago_id;
            //                }
            //                else
            //                    if (cmbFormaDePago.SelectedItem == "CONTADO CHEQUE")
            //                    {
            //                        MessageBox.Show("Pago con Cheque");
            //                    }


            //                nuevaVenta.venta_forma_pago = cmbFormaDePago.SelectedItem.ToString();

            //                context.AddToVentas(nuevaVenta);

            //                if (cmbFormaDePago.SelectedItem == "CTA CTE")
            //                {
            //                    Cuentas Cuenta = new Cuentas();
            //                    Cuenta.cliente_id = this.clienteId;
            //                    Cuenta.cuenta_fecha = dtpVentaFecha.Value;
            //                    Cuenta.cuenta_monto = Convert.ToDecimal(txtbTotal.Text);
            //                    Cuenta.cuenta_pagado = 0;
            //                    Cuenta.id_venta = nuevaVenta.id_venta;
            //                    context.AddToCuentas(Cuenta);
            //                    context.SaveChanges();
            //                }

            //                //Aut.autorizacion_nro_comp2 = NroComp2; // grabo el ultimo numero de factura generado
            //                //Aut.autorizacion_nro_comp2 = NroComp2;

            //                int ventaid = nuevaVenta.id_venta;

            //                for (int j = 0; j < arraylineavta.Length; j++)
            //                {
            //                    arraylineavta[j].id_venta = ventaid;
            //                    context.AddToLineaVenta(arraylineavta[j]); //Agrego la lInea de venta
            //                }

            //                this.context.SaveChanges();
            //            }
            //            catch (Exception ex)
            //            {
            //                MessageBox.Show(ex.ToString());
            //            }

            //            for (int y = 0; y < dtArticulos.Rows.Count; y++)
            //            {

            //                DataRow Ar = dtArticulos.Rows[y];

            //                int Id = Convert.ToInt32(Ar.ItemArray[0]);
            //                articulovendido = context.Articulos.FirstOrDefault(art => art.art_id == Id);
            //                int stockart = articulovendido.art_stock;
            //                int cant = Convert.ToInt32(Ar.ItemArray[2]);
            //                articulovendido.art_stock = stockart - cant;
            //                context.SaveChanges();
            //            }

            //            this.Close();
            //            DialogResult Message = MessageBox.Show("La Venta ha sido registrada con Exito",
            //                                                                      "Disanco Sanitarios", MessageBoxButtons.OK);


            //            //RepVentaA RptVentaA = new RepVentaA(clienteId,dtArticulos,nuevaVenta);

            //            context = null;
            //        }
            //        else
            //        {
            //            DialogResult Message = MessageBox.Show("Debe Seleccionar Articulos para esta Venta",
            //                                                                      "Disanco Sanitarios", MessageBoxButtons.OK);
            //        }
            //    }
            //    else
            //    {
            //        DialogResult Message = MessageBox.Show("Debe Seleccionar un Cliente para esta Venta",
            //                                                                          "Disanco Sanitarios", MessageBoxButtons.OK);
            //    }
            //}
            //else
            //{
            //    DialogResult Message = MessageBox.Show("Debe Seleccionar una forma de Pago para esta Venta",
            //                                                              "Disanco Sanitarios", MessageBoxButtons.OK);
            //}
        }
        
        private void btnAddArticulo_Click(object sender, EventArgs e)
        {
            frmArticuloVentaBuscar busqueda = new frmArticuloVentaBuscar();
            busqueda.ShowDialog();

            if (busqueda.articuloSeleccionado != null)
            {
                int artId = busqueda.articuloSeleccionado.art_id;

                if (!verificarExistenciaArticulo(artId))
                {
                    string artDescripcion = busqueda.articuloSeleccionado.art_nombre;
                    int cantidad = busqueda.cantidad;
                    decimal precioUnitario = busqueda.precioUnitario;
                    decimal precioFinal = busqueda.precioFinal;

                    DataRow nuevoArt = dtArticulos.NewRow();
                    nuevoArt["id"] = artId;
                    nuevoArt["Articulo"] = artDescripcion;
                    nuevoArt["Cantidad"] = cantidad;
                    nuevoArt["Precio unitario"] = "$ " + Decimal.Round(precioUnitario, 2);
                    nuevoArt["Precio total"] = "$ " + Decimal.Round((precioUnitario * cantidad), 2);

                    dtArticulos.Rows.Add(nuevoArt);

                    dgvListaArt.DataSource = dtArticulos;
                    dgvListaArt.Columns["id"].Visible = false;


                    calcularTotales();
                }
                else
                {
                    MessageBox.Show("El articulo seleccionado ya esta en la lista");
                }
            }
        }

        private void btnDelArticulo_Click(object sender, EventArgs e)
        {
            int idSeleccionado = Convert.ToInt32(dgvListaArt.CurrentRow.Cells[0].Value);

            foreach (DataRow fila in dtArticulos.Rows)
            {
                if (Convert.ToInt32(fila[0]) == idSeleccionado)
                {
                    dtArticulos.Rows.Remove(fila);
                    break;
                }
            }

            dgvListaArt.DataSource = dtArticulos;
            dgvListaArt.Columns["id"].Visible = false;

            calcularTotales();
        }

        private void btnNuevoCli_Click(object sender, EventArgs e)
        {
            FrmAgregarCliente nuevoCliente = new FrmAgregarCliente();
            nuevoCliente.ShowDialog();

            if (nuevoCliente.nuevoCliente != null)
            {
                txtbCliNombre.Text = nuevoCliente.nuevoCliente.cliente_nombre;
                txtbCliDireccion.Text = nuevoCliente.nuevoCliente.cliente_direccion;
                txtbCliLocalidad.Text = nuevoCliente.nuevoCliente.cliente_localidad;
                txtbCliCondiva.Text = nuevoCliente.nuevoCliente.CondicionIVA.condicion_sigla;
                txtbCliCuit.Text = nuevoCliente.nuevoCliente.cliente_cuit;
                clienteId = nuevoCliente.nuevoCliente.cliente_id;

                txtbCliDireccion.ReadOnly = true;
                txtbCliLocalidad.ReadOnly = true;
                txtbCliNombre.ReadOnly = true;
                txtbCliCondiva.ReadOnly = true;
                txtbCliCuit.ReadOnly = true;
            }
            nuevoCliente.Dispose();
        }

        //private void NupdDescuento_ValueChanged(object sender, EventArgs e)
        //{
        //    calcularTotales();

        //}

        //private void dtpVentaFecha_ValueChanged(object sender, EventArgs e)
        //{
        //    ComprobarFechaAut(Aut, dtpVentaFecha.Value);
        //}


        private void FrmVentaA_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.F2)
            {
                e.Handled = true;
                this.btnBuscarCliente_Click(sender, e);
            }
            else
            {
                if (e.KeyCode == Keys.F3)
                {
                    e.Handled = true;
                    this.btnAddArticulo_Click(sender, e);
                }
            }
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            context = null;
            this.Close();
        }

        bool verificarExistenciaArticulo(int idArticulo)
        {
            foreach (DataRow fila in dtArticulos.Rows)
            {
                if (Convert.ToInt32(fila["id"]) == idArticulo)
                {
                    return true;
                }
            }

            return false;
        }
    }
}
